home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / boot / BlizKick.lha / BlizKick / Modules / PatchMath020.ASM < prev    next >
Assembly Source File  |  2000-09-04  |  17KB  |  813 lines

  1. ; FILE: Source:modules/PatchMath020.ASM          REV: 1 --- Patches C-compiler math routines with 020+ code
  2.  
  3. ;
  4. ; PatchMath020 module for BlizKick
  5. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  6. ; This module replaces C-compiler math routines with 020+
  7. ; opcodes. V1.1 enables non-64bit mul/div patches for 060.
  8. ; Also sped-up patch scanning a lot.
  9. ;
  10. ; Written by Harry Sintonen.
  11. ; This source code is Public Domain.
  12. ;
  13. ; NOTE: Optimization routine was sent to me by Dave Jones.
  14. ; Thanks a lot Dave!
  15. ;
  16. ;
  17.  
  18.     incdir    "include:"
  19.     include    "exec/execbase.i"
  20.     include    "exec/libraries.i"    ; Some required...
  21.     include    "exec/exec_lib.i"
  22.     include    "blizkickmodule.i"
  23.  
  24.     SECTION    PATCH,CODE
  25. _DUMMY_LABEL
  26.     BK_PTC
  27.  
  28. ; Code is run with following incoming parameters:
  29. ;
  30. ; a0=ptr to ROM start (buffer)    eg. $1DE087B8
  31. ; a1=ptr to ROM start (ROM)    eg. $00F80000 (do *not* access!)
  32. ; d0=ROM lenght in bytes    eg. $00080000
  33. ; a2=ptr to _FindResident routine (will search ROM buffer for resident tag):
  34. ;    CALL: jsr (a2)
  35. ;      IN: a0=ptr to ROM, d0=rom len, a1=ptr to resident name
  36. ;     OUT: d0=ptr to resident (buf) or NULL
  37. ; a3=ptr to _InstallModule routine (can be used to plant a "module"):
  38. ;    CALL: jsr (a3)
  39. ;      IN: a0=ptr to ROM, d0=rom len, a1=ptr to module, d6=dosbase
  40. ;     OUT: d0=success
  41. ; a4=ptr to _Printf routine (will dump some silly things (errormsg?) to stdout ;-)
  42. ;    CALL: jsr (a4)
  43. ;      IN: a0=FmtString, a1=Array (may be 0), d6=dosbase
  44. ;     OUT: -
  45. ; d6=dosbase, a6=execbase
  46. ;
  47. ; Code should return:
  48. ;
  49. ; d0=true if succeeded, false if failed.
  50. ; d1-d7/a0-a6 can be trashed. a7 *must* be preserved! ;-)
  51.  
  52. LTSFVARSTACK    EQU    8
  53.     STRUCTURE KTSTR,0
  54.     APTR    KT_LoadAddr    ; scan start
  55.     ULONG    KT_LoadFileSize    ; scan lenght
  56.     APTR    KT_CallBack    ; null or ptr to printf func
  57.     STRUCT    KT_PrintFVarStack,LTSFVARSTACK
  58.     LABEL    KTSTR_SIZEOF
  59.  
  60. Push    MACRO
  61.     move.l    \1,-(sp)
  62.     ENDM
  63. Pop    MACRO
  64.     move.l    (sp)+,\1
  65.     ENDM
  66. Pushm    MACRO
  67.     movem.l    \1,-(sp)
  68.     ENDM
  69. Popm    MACRO
  70.     movem.l    (sp)+,\1
  71.     ENDM
  72. Call    MACRO
  73.     jsr    (_LVO\1,a6)
  74.     ENDM
  75.  
  76.     btst    #AFB_68020,(AttnFlags+1,a6) ; need minimum 020
  77.     bne.b    .cont
  78. .fail    moveq    #0,d0
  79.     rts
  80.  
  81. .cont
  82.     tst.b    (AttnFlags+1,a6)    ; If no 060 enable all patches:
  83.     bpl.b    .noenall
  84.     lea    (C_Opt1,pc),a5
  85. .enableall    tst.l    (a5)
  86.     beq.b    .noenall
  87.     st    (a5)            ; opt_enable
  88.     lea    (OptimStructSize,a5),a5
  89.     bra.b    .enableall
  90. .noenall
  91.     move.l    a4,_printf        ; Init callback hook
  92.     move.l    d6,_d6reg
  93.  
  94.     lea    (ktstr,pc),a4        ; Build KTSTR structure
  95.     move.l    a0,(KT_LoadAddr,a4)
  96.     move.l    d0,(KT_LoadFileSize,a4)
  97.     lea    (_callback,pc),a0
  98.     move.l    a0,(KT_CallBack,a4)
  99.  
  100.     ; Patch_CompilerRoutines
  101.     ;  IN: a1=KTSTR
  102.     ; OUT: -
  103.     move.l    a4,a1            ; ...and go
  104.     bsr    Patch_CompilerRoutines
  105.  
  106.     moveq    #1,d0            ; Set to 0 for debug
  107.     rts
  108.  
  109. ;  IN: a0=string to print (no linefeed!), a4=KTSTR
  110. ; OUT: -
  111. ;NOTE: may trash a0-a4/a6 and d0-d1 (at least)
  112. _printf    dc.l    0
  113. _d6reg    dc.l    0
  114. _callback    move.l    d6,-(sp)
  115.     move.l    (_d6reg,pc),d6        ; get orig d6 (DosBase)
  116.     lea    (KT_PrintFVarStack,a4),a1
  117.     move.l    (_printf,pc),a2        ; get printf
  118.     jsr    (a2)            ; print it
  119.     lea    (.lf,pc),a0        ; print linefeed
  120.     jsr    (a2)
  121.     move.l    (sp)+,d6
  122.     rts
  123. .lf    dc.b    10,0
  124.  
  125.     CNOP    0,2
  126. ktstr    ds.b    KTSTR_SIZEOF
  127.  
  128.  
  129.     OPT    O-            ; Turn off all optimizations
  130.  
  131. * Dave Jones:
  132. *
  133. * " Finally,  here's  a routine from KickTool (Now inactive) that you
  134. *   may  like  to  add  to  BlizKick.   It  replaces  C compiler Math
  135. *   routines  with  68020  opcodes.   It  probably will need a little
  136. *   hacking  to  get it to work with BlizKick, but I'm sure your more
  137. *   than capable of doing this..
  138. *
  139. *   Note also, that this is a generic routine I wrote for all-purpose
  140. *   exe files, but not all these compiler routines are in kickstarts,
  141. *   so  you  may remove some of them.  I guess you've got quite a few
  142. *   kicks that you can test on, to decide which ones need to remain. "
  143.  
  144.  
  145. *#############################################################################
  146. *#######
  147. *####### ROUTINES BY DAVE JONES, MODIFIED BY HS
  148. *#######
  149. *####### Note that it would be nice to ask Dave Jones for the permission and
  150. *####### the original routines if you intend to use these. This mostly because
  151. *####### I can't be sure if I haven't messed up things again... ;)
  152. *#######
  153.  
  154. *#############################################################################
  155.  
  156. *HS:
  157. * Made this thing run faster.
  158.  
  159.  STRUCTURE optim,0
  160.    UWORD opt_enable
  161.    UWORD opt_offset
  162.    UWORD opt_size
  163.    UWORD opt_repsize
  164.    UWORD opt_repoffset
  165.    UWORD opt_txtoffset
  166.    LABEL OptimStructSize
  167.  
  168. Patch_CompilerRoutines
  169.     Pushm    d0-d2/a0-a5
  170.     Move.l    a1,a4
  171.     Move.l    KT_LoadAddr(a4),a0
  172.  
  173.     move.l    KT_LoadFileSize(a4),d2
  174.     add.l    a0,d2
  175.  
  176. ;******************************************************************
  177.  
  178.     lea    C_Opt1(PC),a2
  179. .SpotOptimisation
  180.     tst.w    (a2)            ;opt_enable
  181.     beq.b    .not_enabled
  182.  
  183.     move.w    opt_offset(a2),a1    ; Get ptr to original C to find
  184.     add.l    a2,a1
  185. .HuntLoop
  186.     move.l    a1,a5
  187.     ; Find
  188.     move.w    opt_size(a2),d1        ; size of original C
  189.     move.l    a0,a3
  190.     subq    #1,d1            ; Correct for the dbcc
  191. .seek    cmpm.w    (a5)+,(a3)+
  192.     dbne    d1,.seek
  193.     bne.b    .NotFound
  194.  
  195.     bsr.b    .FoundOptim
  196.  
  197. .NotFound    addq.l    #2,a0
  198.  
  199.     cmp.l    a0,d2
  200.     bgt.b    .HuntLoop        ; Go back
  201.  
  202. ;******************************************************************
  203. ; If we get here, then we've scanned to EOF for the current
  204. ; optimisation, so move back to beginning of file, and
  205. ; try a different optimisation.
  206.  
  207.     Move.l    KT_LoadAddr(a4),a0    ; restore a0
  208.  
  209. .not_enabled    Lea    OptimStructSize(a2),a2
  210.     Tst.l    (a2)            ; get next optimisation
  211.     Bne.b    .SpotOptimisation
  212.  
  213. .NoMorePatches    Popm    d0-d2/a0-a5
  214.     Rts
  215.  
  216. ;-------------------------------------------------------------------
  217.  
  218.     CNOP    0,4
  219. .FoundOptim    Tst.l    KT_CallBack(a4)
  220.     Beq.b    .QuietMode
  221.  
  222.     Moveq.l    #0,d1
  223.     Move.w    opt_txtoffset(a2),d1
  224.     Add.l    a2,d1
  225.     Move.l    d1,KT_PrintFVarStack(a4) ; Name
  226.  
  227.     Pushm    a0-a4/a6
  228.     Sub.l    KT_LoadAddr(a4),a0
  229.     Move.l    a0,KT_PrintFVarStack+4(a4)
  230.  
  231.     Lea    FoundTxt(pc),a0        ; body
  232.     Move.l    KT_CallBack(a4),a2
  233.     Jsr    (a2)
  234.     Popm    a0-a4/a6
  235.  
  236. .QuietMode
  237.     Move.w    opt_repsize(a2),d0    ; size of my version
  238.     Subq.l    #1,d0            ; correct for dbf
  239.  
  240.     Move.w    opt_repoffset(a2),a1    ; addr of rep code
  241.     Add.l    a2,a1
  242. .CopyPatch    Move.w    (a1)+,(a0)+
  243.     dbf    d0,.CopyPatch
  244.  
  245.  
  246.     Move.w    opt_size(a2),d0        ; original C size in words
  247.     Sub.w    opt_repsize(a2),d0    ; Mycode size in words
  248.     Subq.l    #1,d0
  249.  
  250. .ClrLoop    Clr.w    (a0)+
  251.     dbf    d0,.ClrLoop
  252.     Rts
  253.  
  254. FoundTxt    Dc.b    "Patched %s routine at offset $%lx",0
  255.     CNOP    0,2    
  256.  
  257. ;-------------------------------------------------------------------
  258. *HS:
  259. * Added parameter \2 that tells whether this patch should be done on
  260. * 060.
  261.  
  262. Optim    Macro
  263. .List\1    Dc.w    \2
  264.     Dc.w    \1-.List\1
  265.     Dc.w    \1Size/2
  266.     Dc.w    \1RepSize/2
  267.     Dc.w    \1Rep-.List\1
  268.     Dc.w    \1Txt-.List\1
  269. \1DEF    SET    1
  270.     Endm
  271.  
  272. *HS:
  273. * Here you can enable different optimizations. Only DiceC Mulu and Divs
  274. * can be found from current ROM images.
  275. *
  276.  
  277. C_Opt1    Optim    DiceC_Mulu,1
  278.     Optim    DiceC_Divs,0
  279.     ;Optim    DiceC_MovMem,1
  280.     ;Optim    DiceC_StackLongMuls,1
  281.     ;Optim    Manx_Divs,1
  282.     ;Optim    Manx_Mulu,1
  283.     ;Optim    Manx_Mods,0
  284.     ;Optim    Manx_DivuModu,0
  285.     ;Optim    Manx_DivuModu2,0
  286.     ;Optim    SASMuls,1
  287.     ;Optim    SASMulu,1
  288.     ;Optim    SASDivsMods,0
  289.     ;Optim    SASDivuModu,0
  290.     ;Optim    SASDivsL,0
  291.     ;Optim    GenericMul1,0
  292.     dc.l    0            ** END MARKER!
  293.  
  294. ***************************************************
  295.     IFD    SASMulsDEF
  296. SASMuls
  297. __H0_end    movem.l    D1-D4,-(SP)
  298.     move.l    D0,D4
  299.     eor.l    D1,D4
  300.     tst.l    D0
  301.     beq.b    lbC001C9C
  302.  
  303.     bpl.b    lbC001C70
  304.  
  305.     neg.l    D0
  306. lbC001C70    move.l    D0,D2
  307.     tst.l    D1
  308.     bne.b    lbC001C7A
  309.  
  310.     clr.l    D0
  311.     bra.b    lbC001C9C
  312.  
  313. lbC001C7A    bpl.b    lbC001C7E
  314.  
  315.     neg.l    D1
  316. lbC001C7E    move.l    D0,D3
  317.     mulu    D1,D3
  318.     swap    D2
  319.     mulu    D1,D2
  320.     swap    D2
  321.     clr.w    D2
  322.     add.l    D2,D3
  323.     swap    D1
  324.     mulu    D1,D0
  325.     swap    D0
  326.     clr.w    D0
  327.     add.l    D3,D0
  328.     tst.l    D4
  329.     bpl.b    lbC001C9C
  330.  
  331.     neg.l    D0
  332. lbC001C9C    movem.l    (SP)+,D1-D4
  333.     rts
  334. SASMulsSize    = *-SASMuls
  335.  
  336. ;==================================================
  337. SASMulsRep
  338. _rep0    muls.l    D1,D0
  339.     rts
  340. SASMulsRepSize    = *-SASMulsRep
  341. SASMulsTxt        Dc.b    "SAS C Muls",0
  342.     CNOP    0,2
  343.     ENDC
  344. ***************************************************
  345.     IFD    SASMuluDEF
  346. SASMulu
  347. _seq1    movem.l    D1-D3,-(SP)
  348.     move.l    D0,D2
  349.     beq.b    lbC001CD0
  350.  
  351.     tst.l    D1
  352.     bne.b    lbC001CB8
  353.  
  354.     clr.l    D0
  355.     bra.b    lbC001CD0
  356.  
  357. lbC001CB8    move.l    D0,D3
  358.     mulu    D1,D3
  359.     swap    D2
  360.     mulu    D1,D2
  361.     swap    D2
  362.     clr.w    D2
  363.     add.l    D2,D3
  364.     swap    D1
  365.     mulu    D1,D0
  366.     swap    D0
  367.     clr.w    D0
  368.     add.l    D3,D0
  369. lbC001CD0    movem.l    (SP)+,D1-D3
  370.     rts
  371. SASMuluSize    = *-SASMulu
  372.  
  373. ;==================================================
  374. SASMuluRep
  375. _rep1    mulu.l    D1,D0
  376.     rts
  377. SASMuluRepSize    = *-SASMuluRep
  378. SASMuluTxt        Dc.b    "SAS C Mulu.l",0
  379.     CNOP    0,2
  380.     ENDC
  381. ***************************************************
  382.     IFD    SASDivsModsDEF
  383. SASDivsMods
  384.  
  385. _seq2    movem.l    D2-D5,-(SP)
  386.     move.l    D1,D5
  387.     beq.b    lbC001D16
  388.  
  389.     bpl.b    lbC001CE8
  390.  
  391.     neg.l    D1
  392. lbC001CE8    move.l    D0,D4
  393.     beq.b    lbC001D14
  394.  
  395.     bpl.b    lbC001CF0
  396.  
  397.     neg.l    D0
  398. lbC001CF0    clr.l    D2
  399.     moveq    #$1F,D3
  400. lbC001CF4    asl.l    #1,D0
  401.     roxl.l    #1,D2
  402.     cmp.l    D1,D2
  403.     bcs.b    lbC001D00
  404.  
  405.     sub.l    D1,D2
  406.     addq.l    #1,D0
  407. lbC001D00    dbra    D3,lbC001CF4
  408.  
  409.     move.l    D2,D1
  410.     eor.l    D4,D5
  411.     bpl.b    lbC001D0C
  412.  
  413.     neg.l    D0
  414. lbC001D0C    eor.l    D1,D4
  415.     bpl.b    lbC001D18
  416.  
  417.     neg.l    D1
  418.     bra.b    lbC001D18
  419.  
  420. lbC001D14    clr.l    D1
  421. lbC001D16    clr.l    D0
  422. lbC001D18    movem.l    (SP)+,D2-D5
  423.     rts
  424. SASDivsModsSize    = *-SASDivsMods
  425.  
  426. ;==================================================
  427. SASDivsModsRep
  428. _rep2    divsl.l    D1,D1:D0
  429.     rts
  430. SASDivsModsRepSize =*-SASDivsModsRep
  431. SASDivsModsTxt        Dc.b    "SAS C Divsmods",0
  432.     CNOP    0,2
  433.     ENDC
  434. ***************************************************
  435.     IFD    SASDivuModuDEF
  436. SASDivuModu
  437. _seq3    move.l    D2,-(SP)
  438.     move.l    D3,-(SP)
  439.     tst.l    D1
  440.     beq.b    lbC001D4E
  441.  
  442.     tst.l    D0
  443.     beq.b    lbC001D4C
  444.  
  445.     clr.l    D2
  446.     moveq    #$1F,D3
  447. lbC001D34    asl.l    #1,D0
  448.     roxl.l    #1,D2
  449.     cmp.l    D1,D2
  450.     bcs.b    lbC001D44
  451.  
  452.     sub.l    D1,D2
  453.     Dc.w    $D0BC,0,1        ; Add.l #1,d0
  454. lbC001D44    dbra    D3,lbC001D34
  455.  
  456.     move.l    D2,D1
  457.     bra.b    lbC001D50
  458.  
  459. lbC001D4C    clr.l    D1
  460. lbC001D4E    clr.l    D0
  461. lbC001D50    move.l    (SP)+,D3
  462.     move.l    (SP)+,D2
  463.     rts
  464. SASDivuModuSize = *-SASDivuModu
  465.  
  466. ;==================================================
  467. SASDivuModuRep
  468. _rep3    divul.l    D1,D1:D0
  469.     rts
  470. SASDivuModuRepSize = *-SASDivuModuRep
  471. SASDivuModuTxt        Dc.b    "SAS C Divumodu",0
  472.     CNOP    0,2
  473.     ENDC
  474. ***************************************************
  475.     IFD    SASDivsLDEF
  476. SASDivsL
  477.     dc.l    $4A806A00,$001E4480,$4A816A00,$000C4481,$61000020
  478.     dc.l    $44814E75,$61000018,$44804481,$4E754A81,$6A00000C
  479.     dc.l    $44816100,$00064480,$4E752F02,$48413401,$66000022
  480.     dc.l    $48404841,$48423400,$67000006,$84C13002,$48403400
  481.     dc.l    $84C13002,$48423202,$241F4E75,$2F037610,$0C410080
  482.     dc.l    $64000006,$E1995143,$0C410800,$64000006,$E9995943
  483.     dc.l    $0C412000,$64000006,$E5995543,$4A416B00,$0006E399
  484.     dc.l    $53433400,$E6A84842,$4242E6AA,$484380C1,$36003002
  485.     dc.l    $34034841,$C4C19082,$64000006,$5343D081,$72003203
  486.     dc.l    $4843E7B8,$4840C141,$261F241F
  487.     dc.w    $4E75
  488. SASDivsLSize = *-SASDivsL
  489. ;==================================================
  490. SASDivsLRep    divsl.l    d1,d1:d0
  491.     rts
  492. SASDivsLRepSize = *-SASDivsLRep
  493. SASDivsLTxt        Dc.b    "SAS C Signed Div",0
  494.     CNOP    0,2
  495.     ENDC
  496. ***************************************************
  497.     IFD    Manx_MuluDEF
  498. Manx_Mulu
  499. ; D0 = D0 * D1
  500. _mulu0    movem.l    D1-D3,-(SP)
  501.     move.w    D1,D2
  502.     mulu    D0,D2
  503.     move.l    D1,D3
  504.     swap    D3
  505.     mulu    D0,D3
  506.     swap    D3
  507.     clr.w    D3
  508.     add.l    D3,D2
  509.     swap    D0
  510.     mulu    D1,D0
  511.     swap    D0
  512.     clr.w    D0
  513.     add.l    D2,D0
  514.     movem.l    (SP)+,D1-D3
  515.     rts
  516. Manx_MuluSize    = *-Manx_Mulu
  517.  
  518. ;==================================================
  519. Manx_MuluRep
  520. _rep4    mulu.l    D1,D0
  521.     rts
  522. Manx_MuluRepSize = *-Manx_MuluRep
  523. Manx_MuluTxt        Dc.b    "ManxC Mulu",0
  524.     CNOP    0,2
  525.     ENDC
  526. ***************************************************
  527.     IFD    Manx_DivsDEF
  528. Manx_Divs
  529. _seq5    dc.l    $48E74800,$42844A80,$6A044480,$52444A81
  530.     dc.l    $6A064481,$0A440001,$613E4A44,$67024480
  531.     dc.l    $4CDF0012,$4A804E75
  532.  
  533. Manx_DivsSize    = *-Manx_Divs
  534. ;==================================================
  535. Manx_DivsRep
  536. _rep5    divs.l    D1,D0
  537.     rts
  538. Manx_DivsRepSize = *-Manx_DivsRep
  539. Manx_DivsTxt        Dc.b    "ManxC Divs",0
  540.     CNOP    0,2
  541.     ENDC
  542. ***************************************************
  543.     IFD    Manx_DivuModuDEF
  544. Manx_DivuModu
  545. _seq6    movem.l    D2/D3,-(SP)
  546.     swap    D1
  547.     tst.w    D1
  548.     bne.b    _rep6
  549.  
  550.     swap    D1
  551.     move.w    D1,D3
  552.     move.w    D0,D2
  553.     clr.w    D0
  554.     swap    D0
  555.     divu    D3,D0
  556.     move.l    D0,D1
  557.     swap    D0
  558.     move.w    D2,D1
  559.     divu    D3,D1
  560.     move.w    D1,D0
  561.     clr.w    D1
  562. lbC001DD6    swap    D1
  563.     movem.l    (SP)+,D2/D3
  564.     rts
  565. Manx_DivuModuSize = *-Manx_DivuModu
  566.  
  567. ;==================================================
  568. Manx_DivuModuRep
  569. _rep6    divul.l    D1,D1:D0
  570.     rts
  571. Manx_DivuModuRepSize = *-Manx_DivuModuRep
  572. Manx_DivuModuTxt    Dc.b    "ManxC DivuModu",0
  573.     CNOP    0,2
  574.     ENDC
  575. ***************************************************
  576.     IFD    Manx_ModsDEF
  577. Manx_Mods    Dc.l    $48E74800,$42844A80,$6A044480,$52444A81
  578.     Dc.l    $6A024481,$611A2001,$60D82F01,$61122001
  579.     Dc.l    $221F4A80,$4E752F01,$6106221F,$4A804E75
  580. Manx_ModsSize    = *-Manx_Mods
  581.  
  582. ;==================================================
  583.  
  584. Manx_ModsRep
  585. _rep7    move.l    D1,-(SP)
  586.     divsl.l    D1,D1:D0
  587.     exg    D0,D1
  588.     move.l    (SP)+,D1
  589. lbC001E14    tst.l    D0
  590.     rts
  591. Manx_ModsRepSize = *-Manx_ModsRep
  592. Manx_DivuModu2Txt    Dc.b    "ManxC DivuModu2",0
  593.     CNOP    0,2
  594.     ENDC
  595.  
  596. ***************************************************
  597.     IFD    Manx_DivuModu2DEF
  598. Manx_DivuModu2
  599. _seq8    movem.l    D2/D3,-(SP)
  600.     swap    D1
  601.     tst.w    D1
  602.     bne.b    _rep8
  603.  
  604.     swap    D1
  605.     clr.w    D3
  606.     divu    D1,D0
  607.     bvc.b    lbC001E38
  608.  
  609.     move.w    D0,D2
  610.     clr.w    D0
  611.     swap    D0
  612.     divu    D1,D0
  613.     move.w    D0,D3
  614.     move.w    D2,D0
  615.     divu    D1,D0
  616. lbC001E38    move.l    D0,D1
  617.     swap    D0
  618.     move.w    D3,D0
  619.     swap    D0
  620.     clr.w    D1
  621.     swap    D1
  622.     movem.l    (SP)+,D2/D3
  623.     rts
  624. Manx_DivuModu2Size = *-Manx_DivuModu2
  625.  
  626. ;==================================================
  627. Manx_DivuModu2Rep
  628. _rep8    divul.l    D1,D1:D0
  629.     rts
  630. Manx_DivuModu2RepSize = *-Manx_DivuModu2Rep
  631. Manx_ModsTxt        Dc.b    "ManxC Mods",0
  632.     CNOP    0,2
  633.     ENDC
  634. ***************************************************
  635.     IFD    DiceC_MuluDEF
  636. DiceC_Mulu
  637. __CXM33    Pushm    D2/D3
  638.     move.l    D0,D2
  639.     move.l    D1,D3
  640.     swap    D2
  641.     swap    D3
  642.     mulu    D1,D2
  643.     mulu    D0,D3
  644.     mulu    D1,D0
  645.     add.w    D3,D2
  646.     swap    D2
  647.     clr.w    D2
  648.     add.l    D2,D0
  649.     Popm    D2/D3
  650.     rts
  651. DiceC_MuluSize    = *-DiceC_Mulu
  652. ;==================================================
  653. DiceC_MuluRep    Mulu.l    D1,D0
  654.     Rts
  655. DiceC_MuluRepSize = *-DiceC_MuluRep
  656. DiceC_MuluTxt        Dc.b    "DiceC Mulu",0
  657.     CNOP    0,2
  658.     ENDC
  659. ***************************************************
  660.     IFD    DiceC_DivsDEF
  661. DiceC_Divs    dc.l    $2F024841,$34016600,$00224840,$48414842
  662.     dc.l    $34006700,$000684C1,$30024840,$340084C1
  663.     dc.l    $30024842,$3202241F,$4E752F03,$76100C41
  664.     dc.l    $00806400,$0006E199,$51430C41,$08006400
  665.     dc.l    $0006E999,$59430C41,$20006400,$0006E599
  666.     dc.l    $55434A41,$6B000006,$E3995343,$3400E6A8
  667.     dc.l    $48424242,$E6AA4843,$80C13600,$30023403
  668.     dc.l    $4841C4C1,$90826400,$00085343,$D08164FE
  669.     dc.l    $72003203,$4843E7B8,$4840C141,$261F241F
  670.     dc.w    $4E75
  671.  
  672. DiceC_DivsSize    = *-DiceC_Divs
  673.  
  674. ;==================================================
  675. DiceC_DivsRep    Divsl.l    D1,D1:D0
  676.     Rts
  677. DiceC_DivsRepSize = *-DiceC_DivsRep
  678. DiceC_DivsTxt        Dc.b    "DiceC Divu",0
  679.     CNOP    0,2
  680.     ENDC
  681. ***************************************************
  682.     IFD    DiceC_MovMemDEF
  683. DiceC_MovMem    Move.l    4(SP),A0
  684.     move.l    8(SP),A1
  685.     move.l    12(SP),D0
  686.     ble.s    lbC0008AC
  687.  
  688.     cmp.l    A0,A1
  689.     bcs.s    lbC0008A6
  690.  
  691.     add.l    D0,A0
  692.     add.l    D0,A1
  693. lbC00089E    move.b    -(A0),-(A1)
  694.     subq.l    #1,D0
  695.     bne.s    lbC00089E
  696.     rts
  697.  
  698. lbC0008A6    move.b    (A0)+,(A1)+
  699.     subq.l    #1,D0
  700.     bne.s    lbC0008A6
  701. lbC0008AC    rts
  702. DiceC_MovMemSize = *-DiceC_MovMem
  703. ;==================================================
  704.  
  705. DiceC_MovMemRep    Push    a6
  706.     Move.l    4(SP),A0
  707.     Move.l    8(SP),A1
  708.     Move.l    12(SP),D0
  709.     Call    CopyMem
  710.     Pop    a6
  711.     Rts
  712. DiceC_MovMemRepSize = *-DiceC_MovMemRep
  713. DiceC_MovMemTxt        Dc.b    "DiceC _MovMem",0
  714.     CNOP    0,2
  715.     ENDC
  716. ***************************************************
  717.     IFD    DiceC_StackLongMulsDEF
  718. DiceC_StackLongMuls
  719. _Dice_Muls:    movem.l    d0/d1,-(sp)
  720.     swap    d0
  721.     mulu    d1,d0
  722.     swap    d1
  723.     mulu    2(sp),d1
  724.     add.l    d1,d0
  725.     swap    d0
  726.     clr.w    d0
  727.     move.w    2(sp),d1
  728.     mulu    6(sp),d1
  729.     add.l    d1,d0
  730.     addq.l    #8,sp
  731.     rts
  732. DiceC_StackLongMulsSize = *-DiceC_StackLongMuls
  733. ;==================================================
  734. DiceC_StackLongMulsRep
  735.     muls.l    d0,d1
  736.     move.l    d1,d0
  737.     rts
  738. DiceC_StackLongMulsRepSize = *-DiceC_StackLongMulsRep
  739. DiceC_StackLongMulsTxt    Dc.b    "DiceC Stack Long Muls",0
  740.     CNOP    0,2
  741.     ENDC
  742. ***************************************************
  743.     IFD    GenericMul1DEF
  744. GenericMul1    movem.l    d2-d4,-(sp)
  745.     move.l    d0,d2
  746.     move.l    d0,d3
  747.     swap    d3
  748.     move.l    d1,d4
  749.     swap    d4
  750.     mulu    d1,d0
  751.     mulu    d3,d1
  752.     mulu    d4,d2
  753.     mulu    d4,d3
  754.     swap    d0
  755.     add.w    d1,d0
  756.     moveq    #0,d4
  757.     addx.l    d4,d4
  758.     add.w    d2,d0
  759.     addx.l    d4,d3
  760.     swap    d0
  761.     clr.w    d1
  762.     swap    d1
  763.     clr.w    d2
  764.     swap    d2
  765.     add.l    d2,d1
  766.     add.l    d3,d1
  767.     beq.b    lskip
  768.     ori.b    #2,ccr
  769. lskip:    movem.l    (sp)+,d2-d4
  770.     rts
  771. _LongMul2:    movem.l    d2/d3,-(sp)
  772.     move.l    d0,d2
  773.     move.l    d1,d3
  774.     bsr.b    GenericMul1
  775.     tst.l    d2
  776.     bpl.b    lm1
  777.     sub.l    d3,d1
  778. lm1:    tst.l    d3
  779.     bpl.b    lm2
  780.     sub.l    d2,d1
  781. lm2:    tst.l    d0
  782.     bpl.b    lm3
  783.     not.l    d1
  784. lm3:    tst.l    d1
  785.     beq.b    lm4
  786.     ori.b    #2,ccr
  787. lm4:    movem.l    (sp)+,d2/d3
  788.     rts
  789. GenericMul1Size = *-GenericMul1
  790. ;==================================================
  791. GenericMul1Rep    muls.l    d1,d1:d0
  792.     rts
  793. GenericMul1RepSize = *-GenericMul1Rep
  794. GenericMul1Txt        Dc.b    "Generic Multiply",0
  795.     CNOP    0,2
  796.     ENDC
  797. ***************************************************
  798.  
  799.  
  800. *#############################################################################
  801.  
  802. *#######
  803. *####### END OF
  804. *####### ROUTINES BY DAVE JONES
  805. *#######
  806. *#############################################################################
  807.  
  808.  
  809.     SECTION    VERSION,DATA
  810.  
  811.     dc.b    '$VER: PatchMath020_PATCH 1.1 (3.12.97)',0
  812.  
  813.